﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace ZR.Infrastructure.Helper
{
    public static class NetworkChecker
    {
        /// <summary>
        /// 检查指定IP地址和端口是否可连接
        /// </summary>
        /// <param name="ipAddress">IP地址（IPv4或IPv6）</param>
        /// <param name="port">端口号</param>
        /// <param name="timeoutMs">超时时间（毫秒），默认2000ms</param>
        /// <returns>可连接返回true，否则返回false</returns>
        public static bool IsIpPortReachable(string ipAddress, int port, int timeoutMs = 800)
        {
            // 验证端口范围
            if (port < 1 || port > 65535)
            {
                throw new ArgumentOutOfRangeException(nameof(port), "端口号必须在1-65535之间");
            }

            // 验证IP地址格式
            if (!System.Net.IPAddress.TryParse(ipAddress, out _))
            {
                throw new ArgumentException("无效的IP地址格式", nameof(ipAddress));
            }

            try
            {
                // 使用TcpClient尝试连接
                using (var tcpClient = new TcpClient())
                {
                    // 异步连接并设置超时
                    var connectTask = tcpClient.ConnectAsync(ipAddress, port);
                    // 等待连接完成或超时
                    if (connectTask.Wait(timeoutMs))
                    {
                        // 连接成功
                        return true;
                    }
                    // 超时
                    return false;
                }
            }
            catch (SocketException)
            {
                // 连接失败（如拒绝连接、网络不可达等）
                return false;
            }
            catch (Exception)
            {
                // 其他异常
                return false;
            }
        }
    }
}
